package main

import (
	"fmt"
	"reflect"
	"strconv"
	"strings"
)

/*
字符串是不可改变的字节序列
*/
func main() {
	s := "hello, world"
	fmt.Println("长度", len(s))  //12
	fmt.Println("第一个字符", s[0]) //104，这里返回的是UTF8编码的Unicode码点，想要明确的字符串的话使用string转换
	fmt.Println("第一个字符", string(s[0]))

	fmt.Println("第2~4个字符", s[1:3]) //el
	fmt.Println("第5个以后字符", s[4:])  //o, world

	// 1.异常的操作，读取超过范围的字符和修改字符串的字符
	//fmt.Println(s[len(s)]) //panic: runtime error: index out of range [12] with length 12
	//s[0] = 'L' // compile error: cannot assign to s[0]

	// 2.拼接字符串
	fmt.Println(s + ",123")
	fmt.Println(strconv.Itoa(123) + s)

	// 3.大文本块
	context := `111
222	
333`
	fmt.Println(context)

	// 4.字符串的操作，很多都在strings 这个模块中
	fmt.Println("逗号的位置", strings.IndexAny(s, ","))

	// string -> byte, byte -> string
	sb := []byte(s) //这是一个拷贝出来的新数组
	s2 := string(sb)
	println(sb, s2)

	// string -> int , int -> string
	a := 123
	as := strconv.Itoa(a)                 // 转10进制
	as2 := strconv.FormatInt(int64(a), 2) //二进制
	println(a, as, as2)

	sa, err := strconv.Atoi("123")
	if err == nil {
		fmt.Println("sa类型", reflect.TypeOf(sa))
	}
	sa2, err := strconv.ParseInt("123", 10, 64)
	if err == nil {
		fmt.Println("sa2类型", reflect.TypeOf(sa2))
	}
	/*
		bytes包和strings同时提供了许多实用函数
		1. strings包中的六个函数
			func Contains(s, substr string) bool
			func Count(s, sep string) int
			func Fields(s string) []string
			func HasPrefix(s, prefix string) bool
			func Index(s, sep string) int
			func Join(a []string, sep string) string

		2.bytes包中也对应的六个函数：
			func Contains(b, subslice []byte) bool
			func Count(s, sep []byte) int
			func Fields(s []byte) [][]byte
			func HasPrefix(s, prefix []byte) bool
			func Index(s, sep []byte) int
			func Join(s [][]byte, sep []byte) []byte
	*/
	// 5. Unicode 字符
	fmt.Println("世界",
		"\xe4\xb8\x96\xe7\x95\x8c", // \x   表示Unicode的16进制转移字节码,这里已经可以看出来“世界”两个字符 各占3个字节。
		"\u4e16\u754c",             // \u   表示utf8的16进制的码点值
		"\U00004e16\U0000754c")     // \U   表示utf8的32进制的码点值

	// 遍历字符串
	for i, r := range "123456" {
		fmt.Printf("%d, 字符:%q, 10进制码值：%d\n", i, r, r)
	}
}
